<h1>Tutorial - Nieuws artikelen toevoegen</h1>

<p>In het vorige deel hebben wij een nieuws pagina gemaakt waarop we de nieuws
artikelen uit de database tonen. In dit deel maken wij een pagina waar we deze
artikelen kunnen toevoegen.</p>

<br />

<h2>De View</h2>
<p>We maken eerst ons formulier, deze krijgt een textfield voor de titel en 
een textarea voor het artikel zelf. Maak een nieuw bestand: 
<strong>application/views/news/add.phtml</strong> en geef het de volgende code:</p>

<div class="code">
<?php
highlight_string('<h1>Nieuws artikel toevoegen</h1>

<?=form_open(\'news/add\')?>
<fieldset>
    <legend>Nieuw artikel</legend>
    
    <?=validation_errors()?>

    <p>
        <label for="title">Titel</label><br />
        <input type="text" name="title" />
    </p>
    
    <p>
        <label for="article">Artikel</label><br />
        <textarea name="article"></textarea>
    </p>
    
    <p>
        <input type="submit" name="add_news" value="Voeg toe" />
    </p>
</fieldset>
<?=form_close()?>
');
?>
</div>

<p>Je ziet hier dat we gebruik maken van de functie <strong>form_open()</strong>.
Deze functie genereert de opening tag voor ons formulier. Het grote voordeel van deze
functie is dat we geen rekening hoeven te houden met de base URL, aangezien dit voor
ons wordt geregeld! Daarna zien we de functie <strong>validation_errors()</strong>.
Ook deze is erg handig, aangezien het alle errors weergeeft die gegenereerd zijn
door de <strong>FormValidation</strong> class, die we straks in onze controller gaan
gebruiken. Helemaal onderaan zien we <strong>form_close()</strong>, deze geef altijd
een closing tag voor het formulier terug, een <strong>&#60;/form></strong> dus.
Onze view is nu klaar, we gaan nu verder naar de model!</p>

<br />

<h2>De Model</h2>
<p>We gaan nu onze <strong>NewsModel</strong> uitbreiden, zodat we nieuws artikelen
kunnen toevoegen. Open 
<strong>application/models/NewsModel.php</strong> en geef het de volgende code:</p>

<div class="code">
<?php
highlight_string('<?php
// We geven aan dat dit bestand zich bevind in het pakket: application/models
namespace application\models;

// We hebben de Model class nodig uit system\core
use system\core\Model;

class NewsModel extends Model
{
    /**
     * Get news
     *
     * Get all the news from the database.
     *
     * @return array
     */
    public function getNews()
    {
        // We hebben toegang tot de "db" property, omdat we de Model class extenden
        return $this->db->get(\'news\')->result();
    }
    
    /**
     * Add news articles
     *
     * Deze methode kan nieuws artikelen toevoegen aan de database. We gaan ervan
     * uit dat de title en article via de POST methode zijn meegestuurd!
     */
     public function addNews()
     {
        // We geven hier aan welke kolommen welke waardes moeten krijgen
        $data = array(
            \'title\' => $_POST[\'title\'],
            \'article\' => $_POST[\'article\']        
        );
        
        // Vervolgens inserten we deze gegevens in de database tabel "news"
        $this->db->insert(\'news\', $data);
     }
}
');
?>
</div>

<p>We hebben hier de methode <strong>addNews()</strong> toegevoegd. Je ziet hier dat
    we een array defini&eumlren met de kolomnamen van de database tabel als <strong>key</strong>
    en de waarde hiervan als <strong>value</strong>. Wij geven hier de kolom <strong>title</strong> de waarde van 
<strong>$_POST['title']</strong> en hetzelfde voor de kolom <strong>article</strong>. Nu 
we dit gedaan hebben, kunnen we er nog weinig mee. We moeten aangeven wat we nu willen doen.
We willen deze data graag toevoegen als een nieuwe rij in de database, dus gebruik wij de
<strong>insert()</strong> methode. Deze methode gaat ervan uit dat de eerste parameter de
naam van de tabel is die je wilt gebruiken en de tweede parameter een array met de data.</p>

<br />

<h2>De Controller</h2>
<p>Onze model is nu opgezet naar wens, we zullen nu onze <strong>News</strong> controller
moeten aanpassen om de <strong>add</strong> pagina toe te voegen. Open 
<strong>application/controllers/News.php</strong> en voeg de volgende methode toe onder de index() methode:</p>

<div class="code">
<?php
highlight_string('<?php
// Deze code komt NA de index() methode

public function add()
{
    // Hier komt straks onze logica
}
');
?>
</div>

<p>Voor we verder gaan, navigeer in je browser naar <strong>http://localhost/news/add</strong>. Je 
krijgt een foutmelding te zien he? Dat komt omdat we dit in onze routing moeten aangeven. Onze routing
is nu:</p>

<div class="code">
<strong>[routing]</strong><br />
news = news<br />
:any: = pages/view/$1
</div>

<p>Misschien zie je het zelf al wel, we routen alleen <strong>news</strong> door naar <strong>news</strong>.
    Voor de rest doen we niks. Wat we graag willen is dat <strong>news/add</strong> wordt doorverwezen
    naar <strong>news/add</strong>. Nu kunnen wij dit op deze manier in onze routing zetten, maar
    er is een mooiere manier! We kunnen ook <strong>news/:any:</strong> gebruiken, hierdoor
    hoeven we niet voor elke methode een aparte routing te maken. Pas je routing nu aan naar
    het volgende:</p>

<div class="code">
<strong>[routing]</strong><br />
news/:any: = news/$1<br />
news = news<br />
:any: = pages/view/$1
</div>

<p>Navigeer nu voor de tweede keer naar: <strong>http://localhost/news/add</strong>. We krijgen de pagina
voor ons, maar echter wel met een error:</p>

<div class="code">
Fatal error: Call to undefined function form_open() in ../application/views/news/add.phtml on line 3
</div>

<p>Deze error ontstaat omdat we functies willen gebruiken uit de <strong>Form helper</strong>.
We moeten deze helper dus laden, voordat we de functies hiervan kunnen gebruiken! We gaan de helper
laden in onze controller. Open <strong>application/controllers/News.php</strong> en pas het aan naar:</p>

<div class="code">
<?php
highlight_string('<?php
// Deze code komt NA de index() methode

public function add()
{
    // We laden hier de form helper, zodat we de form helper functies kunnen gebruiken!
    $this->load->helper(\'form\');
}
');
?>
</div>

<p>Refresh de pagina. Weer een error? Dit klopt allemaal! Ik loop jullie er stap voor stap
doorheen, zodat je weet wat deze errors betekenen. Als het goed is heb je nu de volgende
error:</p>

<div class="code">
    The Form Validation group "default" does not exist.
</div>

<p>Dit komt omdat we in onze view de functie <strong>validation_errors()</strong>
    gebruiken, zonder dat we een instantie hebben van de <strong>FormValidation</strong> class
in onze controller. De FormValidation class is een erg handige library die ons helpt bij het
valideren van formulieren. Pas de <strong>News</strong> controller aan naar het volgende:</p>

<div class="code">
<?php
highlight_string('<?php
namespace application\controllers;

use system\core\Controller;
use application\models\NewsModel;

// LET OP! Deze regel is erg belangrijk!
use system\libraries\FormValidation;

// ...

public function add()
{
    // We laden hier de form helper, zodat we de form helper functies kunnen gebruiken!
    $this->load->helper(\'form\');
    
    // We maken een nieuwe instantie van de FormValidation class
    $formValidation = new FormValidation();
    
    // Welke velden hebben welke regels?
    $formValidation->rules(\'title\', \'Titel\', \'required|min_length[3]\');
    $formValidation->rules(\'article\', \'Artikel\', \'required|min_length[3]\');
    
    // De validatie is goedgekeurd
    if ( $formValidation->run() === TRUE )
    {
        // We maken een nieuwe instantie van NewsModel
        $newsModel = new NewsModel();
        
        // Vervolgens roepen wij de addNews() methode aan om het artikel toe te voegen
        $newsModel->addNews();
        
        // Het nieuws is toegevoegd, we sturen de gebruiker door naar het nieuws overzicht
        redirect(\'news\');
    }
}
');
?>
</div>

<p>We hebben hier een instantie gemaakt van de <strong>FormValidation</strong> class.
    We slaan deze instantie op in <strong>$formValidation</strong>. De constructor van deze
class kan 1 argument accepteren, dit is de validatie groep. Standaard is de groep "default".
Als je dus meerde validaties op 1 pagina wilt, kun je een andere groep via de constructor meegeven.
Daarna roepen wij de <strong>rules()</strong> methode aan om de regels te zetten voor de formulier
velden. De opmaak van deze methode is: <strong>rules($fieldname, $label, $rules)</strong>.
De regels moeten worden gescheiden door een streep (|).</p>

<p>Alle regels zijn gezet, we moeten nu een <i>if</i> statement maken om te controleren
    of de validatie succesvol was. Dit doen we doormiddel van de <strong>run()</strong> methode.
    Als de validatie succesvol is, dan maken we een nieuwe instantie van <strong>NewsModel</strong> die we
    eerder hebben gemaakt. Deze model bevat 2 methodes, waarvan wij <strong>addNews()</strong> aanroepen.
    Als het nieuws artikel is toegevoegd, wordt de gebruiker doorgestuurd naar de pagina <strong>news</strong>.</p>

<p>Ga nu naar <strong>http://localhost/news/add</strong> en bekijk de pagina die je zojuist
hebt gemaakt! Probeer eens nieuws berichten toe te voegen en check je form validatie ook eens.</p>

<p>Dit was het einde van deze tutorial. Ik hoop dat dit je heeft geholpen en ik wens je een mooie
    tijd tegemoet met <strong>G</strong>!</p>